package com.kty.cesuan.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kty.cesuan.mapper.SjqmMapper;
import com.kty.cesuan.pojo.Qmdj;
import com.kty.cesuan.service.SjqmService;
import com.kty.methods.sjqm.method.choice.GregorianDate;
import com.kty.methods.sjqm.method.choice.NowDate;
import com.kty.methods.sjqm.method.choice.lunarDate;
import com.kty.methods.sjqm.method.entrance.QiMenDunJia;
import com.kty.methods.sjqm.method.qmdj.QiMen;
import com.kty.methods.utils.Utils;
import com.nlf.calendar.Lunar;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
public class SjqmServiceImpl extends ServiceImpl<SjqmMapper, Qmdj> implements SjqmService {

    @Autowired
    private SjqmService sjqmService;

    private static final QiMenDunJia qiMenDunJia = new QiMenDunJia();
    private static int upCount = 0; // 记录向前推算的次数
    private static int downCount = 0; // 记录向后推算的次数

//**********************************************************************************************************************

    /**
     * 按照当前公历日期测算
     */
    public boolean now() {

        // 按照【当前日期测算】
        QiMen qiMen = new NowDate().getQiMen();

        // 信息封装
        qiMenDunJia.run(qiMen);

        // 信息保存至数据库
        return calculation(qiMen);

    }

    /**
     * 以当前时间按为基础向前推算
     */
    public boolean up() {

        // 重置向后推算的次数
        downCount = 0;

        // 默认使用当前日期初始化
        Lunar date = new Lunar();
        Date date1 = new Date();

        int year = date.getYear(); // 获取农历年
        int month = date.getMonth(); // 获取农月
        int day = date.getDay(); // 获取农历日
        int time = date1.getHours() - 2 - upCount; // 获取当前时间-2小时
        int minute = date.getMinute(); // 获取分
        int second = date.getSecond(); // 获取秒
        upCount += 2;

        // 通过农历日期向前测算
        QiMen qiMen = new lunarDate(year, month, day, time, minute, second).getQiMen();

        // 信息封装
        qiMenDunJia.run(qiMen);

        // 信息保存至数据库
        return calculation(qiMen);

    }

    /**
     * 以当前时间按为基础向后推算
     */
    public boolean down() {

        // 重置向前推算的次数
        upCount = 0;

        // 默认使用当前日期初始化
        Lunar date = new Lunar();
        Date date1 = new Date();

        int year = date.getYear(); // 获取农历年
        int month = date.getMonth(); // 获取农月
        int day = date.getDay(); // 获取农历日
        int time = date1.getHours() + 2 + downCount; // 获取当前时间-2小时
        int minute = date.getMinute(); // 获取分
        int second = date.getSecond(); // 获取秒
        downCount += 2;

        // 通过农历日期向前测算
        QiMen qiMen = new lunarDate(year, month, day, time, minute, second).getQiMen();

        // 信息封装
        qiMenDunJia.run(qiMen);

        // 信息保存至数据库
        return calculation(qiMen);

    }

    /**
     * 重置为当前时间
     *
     * @return true：成功  false：失败
     */
    public boolean reset() {

        // 判断时间是否重置
        if ((upCount == 0) && (downCount == 0)) {
            return false;
        }
        upCount = 0;
        downCount = 0;
        return true;

    }

    /**
     * 按照指定日期测算
     *
     * @param year   年
     * @param month  月
     * @param day    日
     * @param time   时
     * @param minute 分
     * @param second 秒
     * @param choice 0：公历日期     1：农历日期
     */
    public boolean choice(int year, int month, int day, int time, int minute, int second, int choice) {

        // 初始化
        QiMen qiMen;
        // 判断
        if (choice == 1) {
            // 通过农历日期测算
            qiMen = new lunarDate(year, month, day, time, minute, second).getQiMen();
        } else {
            // 通过公历日期测算
            qiMen = new GregorianDate(Utils.stringToDate(year, month, day, time, minute, second)).getQiMen();
        }

        // 信息封装
        qiMenDunJia.run(qiMen);

        // 信息保存至数据库
        return calculation(qiMen);

    }

    /**
     * 测算并保存信息
     *
     * @param qiMen 奇门
     * @return true：测算成功    false：测算失败
     */
    private boolean calculation(QiMen qiMen) {

        // 1、数据判断
        LambdaQueryWrapper<Qmdj> qw = new LambdaQueryWrapper<>();
        qw.in(Qmdj::getLunarDate, qiMen.getLunarDateStr());
        int count = this.count(qw);
        // 若count>0，则不可再次测算
        if (count > 0) {
            return false;
        }

        // 2、设置数据
        Qmdj qmdj = qiMenDunJia.infoToSql(qiMen);

        // 3、添加数据
        sjqmService.save(qmdj);
        return true;

    }

}
